home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork2.lzh / サンプル基礎編 / 文字列描画 / TEXTWR.C < prev    next >
Text File  |  1994-03-10  |  12KB  |  321 lines

  1. /******************************************************************************
  2.  *    textwr.c:    文字列の描画
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  *
  6.  *    機能説明:
  7.  *    このプログラムは、ウィンドウを作成し、アップデートイベントで文字列を
  8.  *    描画します。
  9.  */
  10. #include <ctype.h>
  11. #include <stdlib.h>
  12. #include <event.h>        /* イベントマンを利用するときに必要    */
  13. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  14. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  15. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  16. #include <task.h>        /* タスクマンを利用するときに必要    */
  17. #include "textwr.h"        /* このプログラム固有のヘッダファイル    */
  18.  
  19. char _sxkernelcomm[] = SXKERNEL;    /* カーネル起動コマンド        */
  20.  
  21. /******************************************************************************
  22.  *    main():        メイン関数
  23.  ******************************************************************************
  24.  */
  25. int main(void)
  26. {
  27.     ComVal cv;            /* 共通変数            */
  28.  
  29.     if (!init(&cv)) {        /* 初期化処理を行う        */
  30.         showErrDialog(&cv);    /* エラーダイアログを表示する    */
  31.         cv.endFlag = TRUE;    /* 終了フラグをセットする    */
  32.     }
  33.     /* 終了フラグがセットされるまでループする */
  34.     while (!cv.endFlag) {
  35.         cv.errorCode = 0;    /* エラーコードをクリアする    */
  36.         /* タスクマンからイベントを取得する */
  37.         TSEventAvail(cv.eventMask, &cv.event);
  38.         /* 各イベントに対応した処理を行う */
  39.         switch (cv.event.ts.what) {
  40.         case E_MSLDOWN:        /* マウスレフトダウンイベント    */
  41.             msLDownEvent(&cv);
  42.             break;
  43.         case E_KEYDOWN:        /* キーダウンイベント        */
  44.             keyDownEvent(&cv);
  45.             break;
  46.         case E_UPDATE:        /* アップデートイベント        */
  47.             updateEvent(&cv);
  48.             break;
  49.         case E_ACTIVATE:    /* アクティベートイベント    */
  50.             activateEvent(&cv);
  51.             break;
  52.         case E_SYSTEM1:        /* システムイベント        */
  53.         case E_SYSTEM2:
  54.             systemEvent(&cv);
  55.             break;
  56.         }
  57.         if (cv.errorCode != 0)    /* エラーが発生したか?        */
  58.             showErrDialog(&cv); /* エラーダイアログを表示する */
  59.     }
  60.     /* 終了手続きを行う */
  61.     endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
  62.  
  63.     return 0;
  64. }
  65.  
  66. /******************************************************************************
  67.  *    init():        初期化処理
  68.  ******************************************************************************
  69.  *    引数:    ComVal *pcv    共通変数へのポインタ
  70.  *    戻り値:    BOOLEAN        = TRUE:  初期化成功
  71.  *                = FALSE: 初期化失敗(終了)
  72.  *    注釈:    共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
  73.  *        表示などを行う。
  74.  */
  75. BOOLEAN init(ComVal *pcv)
  76. {
  77.     pcv->windowPtr = NULL;        /* ウィンドウポインタ        */
  78.     pcv->activeFlag = FALSE;    /* アクティブフラグ        */
  79.     pcv->eventMask = EVENTMASK;    /* イベントマスク        */
  80.     pcv->errorCode = 0;        /* エラーコード            */
  81.     pcv->endFlag = FALSE;        /* 終了フラグ            */
  82.  
  83.     TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する    */
  84.  
  85.     if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
  86.         pcv->errorCode = 1;    /* バージョン2より古い        */
  87.         return FALSE;        /* 失敗したのでFALSEを返す    */
  88.     }
  89.     if (!createWindow(pcv)) {    /* ウィンドウを作成する        */
  90.         pcv->errorCode = 2;    /* 作成できなかった        */
  91.         return FALSE;        /* 失敗したのでFALSEを返す    */
  92.     }
  93.  
  94.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  95.     GMForeColor(G_BLACK);        /* フォアグラウンドカラーを黒にする */
  96.     /* バックグラウンドカラーをライトグレーにする */
  97.     GMBackColor(G_LGRAY);
  98.  
  99.     WMShow(pcv->windowPtr);        /* ウィンドウを表示する        */
  100.     return TRUE;            /* 成功したのでTRUEを返す    */
  101. }
  102.  
  103. /******************************************************************************
  104.  *    createWindow():    ウィンドウの作成
  105.  ******************************************************************************
  106.  *    引数:    ComVal *pcv    共通変数へのポインタ
  107.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  108.  *                = FALSE: 作成失敗(終了)
  109.  */
  110. BOOLEAN createWindow(ComVal *pcv)
  111. {
  112.     int paramFlags;            /* パラメータの有無        */
  113.     Rect rc;
  114.     Task task;            /* タスク管理レコード        */
  115.  
  116.     static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
  117.  
  118.     TSGetTdb(&task, TS_OWN);    /* タスク管理レコードを取得する    */
  119.     paramFlags = TSTakeParam(    /* コマンドラインを解析する    */
  120.         task.command,        /* コマンドライン        */
  121.         &rc,            /* 指定されたウィンドウ位置    */
  122.         NULL,            /* 最終文字列を格納しない    */
  123.         0,            /* アドレステーブルを保存しない    */
  124.         NULL,            /* アドレステーブルを作成しない    */
  125.         NULL);            /* ポインタを確保しない        */
  126.     if (!(paramFlags & 1)) {    /* ウィンドウ位置の指定があるか? */
  127.         /* ない場合、システムからウィンドウの左上座標を取得する */
  128.         rc = winSize;
  129.         GMSlideRect(&rc, TSGetWindowPos());
  130.     }
  131.  
  132.     pcv->windowPtr = WMOpen(    /* ウィンドウをオープンする    */
  133.         NULL,            /* ウィンドウポインタを確保する    */
  134.         &rc,            /* ウィンドウの表示位置        */
  135.         WINTITLE,        /* ウィンドウタイトル        */
  136.         FALSE,            /* オープン時に描画しない    */
  137.         WI_STD2 << 4,        /* タイトルの広い標準ウィンドウ    */
  138.         W_FRONT,        /* 一番手前に表示する        */
  139.         TRUE,            /* クローズボタンを使用する    */
  140.         TSGetID());        /* 自分のタスクID        */
  141.     if (pcv->windowPtr == NULL)
  142.         return FALSE;        /* 失敗したのでFALSEを返す    */
  143.  
  144.     return TRUE;            /* 成功したのでTRUEを返す    */
  145. }
  146.  
  147. /******************************************************************************
  148.  *    msLDownEvent():    マウスレフトダウンイベント処理
  149.  ******************************************************************************
  150.  *    引数:    ComVal *pcv    共通変数へのポインタ
  151.  *    注釈:
  152.  *    ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  153.  *    この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
  154.  */
  155. void msLDownEvent(ComVal *pcv)
  156. {
  157.     int partCode;            /* ウィンドウのパートコード    */
  158.     Window *wTemp;            /* テンポラリウィンドウポインタ    */
  159.  
  160.     /* イベントが自分のウィンドウか? */
  161.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  162.         /* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
  163.         if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
  164.             /* ウィンドウをアクティブにする */
  165.             WMSelect(pcv->windowPtr);
  166.             /* ボタンが押された場所のパートコードを取得する */
  167.             partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
  168.             /* タイトルバー以外か、左ボタンが離されたか? */
  169.             if (partCode != W_INDRAG || !EMLStill())
  170.                 return;
  171.         }
  172.         /* マウスのボタンが押されている間、ウィンドウ上の各種処理を
  173.            システムに任せて、ボタンが押された、または離された場所の
  174.            パートコードを取得する */
  175.         partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
  176.         if (partCode == W_INCLOSE) /* クローズボタンか?    */
  177.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  178.     }
  179. }
  180.  
  181. /******************************************************************************
  182.  *    keyDownEvent():    キーダウンイベント処理
  183.  ******************************************************************************
  184.  *    引数:    ComVal *pcv    共通変数へのポインタ
  185.  *    注釈:    OPT.1+'Q'キーでの終了処理を行う。
  186.  */
  187. void keyDownEvent(ComVal *pcv)
  188. {
  189.     int shortCut;            /* ショートカットキー        */
  190.  
  191.     if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか?    */
  192.         /* キー入力した文字を大文字に変換する */
  193.         shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
  194.         if (shortCut == 'Q')    /* 終了か?            */
  195.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  196.     }
  197. }
  198.  
  199. /******************************************************************************
  200.  *    updateEvent():    アップデート処理
  201.  ******************************************************************************
  202.  *    引数:    ComVal *pcv    共通変数へのポインタ
  203.  *    注釈:
  204.  *    アップデート処理としてウィンドウ内部を描画する。
  205.  *    この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
  206.  *    イベントの処理ができなくなります。
  207.  */
  208. void updateEvent(ComVal *pcv)
  209. {
  210.     /* イベントが自分のウィンドウか? */
  211.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  212.         WMUpdate(pcv->windowPtr); /* アップデートを開始する    */
  213.         drawGraph(pcv);        /* ウィンドウ内部を描画する    */
  214.         WMUpdtOver(pcv->windowPtr); /* アップデートを終了する    */
  215.     }
  216. }
  217.  
  218. /******************************************************************************
  219.  *    drawGraph():    ウィンドウ内部の描画
  220.  ******************************************************************************
  221.  *    引数:    ComVal *pcv    共通変数へのポインタ
  222.  */
  223. void drawGraph(ComVal *pcv)
  224. {
  225.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  226.  
  227.     GMMove(LONGWORD(STR1_X, STR1_Y)); /* ペンを移動する        */
  228.     GMDrawStrZ("SX-WINDOWサンプルテキスト"); /* 文字列を描画する    */
  229. }
  230.  
  231. /******************************************************************************
  232.  *    activateEvent():    アクティベートイベント処理
  233.  ******************************************************************************
  234.  *    引数:    ComVal *pcv    共通変数へのポインタ
  235.  *    注釈:    アクティブ、インアクティブによるアクティブフラグの切り替えと、
  236.  *        イベントマスクの切り替えを行う。
  237.  */
  238. void activateEvent(ComVal *pcv)
  239. {
  240.     /* イベントが自分のウィンドウか? */
  241.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  242.         pcv->activeFlag = TRUE;    /* アクティブフラグをセットする    */
  243.         /* アクティブ時のイベントマスクをセットする */
  244.         pcv->eventMask = EVENTMASK | EM_KEYDOWN;
  245.     /* イベントが他のウィンドウで、自分がアクティブ状態か? */
  246.     } else if (pcv->activeFlag) {
  247.         pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
  248.         /* インアクティブ時のイベントマスクをセットする */
  249.         pcv->eventMask = EVENTMASK;
  250.     }
  251. }
  252.  
  253. /******************************************************************************
  254.  *    systemEvent():    システムイベント処理
  255.  ******************************************************************************
  256.  *    引数:    ComVal *pcv    共通変数へのポインタ
  257.  *    注釈:    全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
  258.  *        対応した処理を行う。
  259.  */
  260. void systemEvent(ComVal *pcv)
  261. {
  262.     switch (pcv->event.ts.what2) {    /* イベントの種類は?        */
  263.     case CLOSEALL:            /* 全ウィンドウのクローズ    */
  264.     case ENDTSK:            /* 全タスクの終了        */
  265.         pcv->endFlag = TRUE;    /* 終了フラグをセットする    */
  266.         break;
  267.     case WINDOWSELECT:        /* ウィンドウのセレクト        */
  268.         WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
  269.         break;
  270.     }
  271. }
  272.  
  273. /******************************************************************************
  274.  *    showErrDialog():    エラーダイアログの表示
  275.  ******************************************************************************
  276.  *    引数:    ComVal *pcv    共通変数へのポインタ
  277.  */
  278. void showErrDialog(ComVal *pcv)
  279. {
  280.     int i;
  281.  
  282.     static struct {            /* エラー情報            */
  283.         int code;        /* エラーコード            */
  284.         int manager;        /* 使用するマネージャ        */
  285.         int flag;        /* 表示フラッグ            */
  286.         char *message;        /* エラーメッセージ        */
  287.     } errInfo[] = {
  288.         { 1, 1, D_RED,    "SX SYSTEMのバージョンが違います。" },
  289.         { 2, 2, D_RED,    "ウィンドウが作成できません。" },
  290.         { 0, 1, D_YELLOW, "エラーが発生しました。" }
  291.     };
  292.  
  293.     for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す    */
  294.         if (errInfo[i].code == pcv->errorCode)
  295.             break;
  296.     switch (errInfo[i].manager) {    /* マネージャの選択        */
  297.     case 1:                /* ダイアログマン        */
  298.         DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  299.         break;
  300.     case 2:                /* タスクマン            */
  301.         TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  302.         break;
  303.     }
  304. }
  305.  
  306. /******************************************************************************
  307.  *    endProc():    終了手続き
  308.  ******************************************************************************
  309.  *    引数:    int code    終了コード
  310.  *        ComVal *pcv    共通変数へのポインタ
  311.  *    注釈:    ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
  312.  */
  313. void endProc(int code, ComVal *pcv)
  314. {
  315.     /* ウィンドウポインタが確保されたままか? */
  316.     if (pcv->windowPtr != NULL)
  317.         WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する    */
  318.  
  319.     exit(code);            /* プログラムを終了する        */
  320. }
  321.